/*****************************************************************************
*                     Organizacion de Datos - 75.06                          *
*                         Catedra Lic. Servetto                              *
*            Facultad de Ingenieria - Universidad de Buenos Aires            *
******************************************************************************/

#include "ParseadorComandos.h"
#include "AdministradorDeOperaciones.h"
#include "AdministradorMetadata.h"

#include <list>
#include <string>
#include <fstream>

namespace CapaConsulta 
{

	Operacion* ParseadorComandos::ParsearEjecucion(list<string>* operacion) {
		
		if (operacion->size() != 3)
		{
			cerr << "La ejecucion de un comando shell espera un comando de la forma EXECUTE SHELL '' (3 cadenas), se encontro una cantidad de cadenas distinta de las esperada (" << operacion->size() << " cadena(s))." << endl;
			throw new exception();
		}

		string executeSupuesto = operacion->front();
		operacion->pop_front();
		string shellSupuesto = operacion->front();
		operacion->pop_front();
		string comandoSupuesto = operacion->front();
		
		if (executeSupuesto != "EXECUTE")
		{
			cerr << "La ejecucion de un comando shell espera el comando EXECUTE, se encontro " << executeSupuesto << "." << endl;
			throw new exception();
		}
		
		if (shellSupuesto != "SHELL")
		{
			cerr << "La  ejecucion de un comando shell espera el comando SHELL despues de EXECUTE, se encontro " << shellSupuesto << "." << endl;
			throw new exception();
		}
		
		if (!ParseadorComandos::ValidarDatosEntreComillasSimples(comandoSupuesto))
		{
			cerr << "La ejecucion de un comando shell requiere el comando a ejecutar entre '' despues de EXECUTE SHELL, se encontro " << comandoSupuesto << "." << endl;
			throw new exception();
		}
		
		string comando = ParseadorComandos::EliminarComillasSimplesDeDatos(comandoSupuesto);
		
		EjecutarComando* operacionEjecutarComando = new EjecutarComando();
		
		operacionEjecutarComando->Comando = new string(comando);
		
		return operacionEjecutarComando;
	};
	
}
